package top.lcm889.juc.lmmutable;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Coder-lcm
 * @date 2021/4/30
 *
 *  不可变的类型
 *      final修饰的基本数据类型
 *      String
 *      枚举类型
 *      Number部分子类：Long、Double。。。。
 *      集合中的不可变集合类型可以使用Collections.unmodifiableXXX() 方方法来获取一一个不不可变的集合
 */
public class Lmmutable {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "data1");
        Map<Integer, String> unmodifiableMap = Collections.unmodifiableMap(map);
        System.out.println( "原数据 map" + unmodifiableMap.get(1));
        // 尝试向不可以变集合插入数据
//        unmodifiableMap.put(1, "data11"); //将会直接抛出异常
        map.put(1, "data11");
        map.put(2, "data2");
        System.out.println("map data in index 0: " + map.get(1)); // data11
        System.out.println("map data in index 1: " + map.get(2));
        // 下方输出代码可见，对map的更新将会同步到unmodifiableMap中
        System.out.println("unmodifiableMap data in index 0:" + unmodifiableMap.get(1));//data11
        System.out.println("unmodifiableMap data in index 1: " + unmodifiableMap.get(2));//data2

        System.out.println(map.hashCode()); // -1243563755
        System.out.println(unmodifiableMap.hashCode()); // -1243563755


        /***
         * 解释，为什么明明是一个不可变的集合，但通过修改原可变集合，也会对不可变集合进行更新
         *  因为Collections.unmodifiableMap(map);获取的只是原map的浅拷贝对象（拷贝了引用地址 + 数据），
         *  相当于二者共享一个引用，所以一方对共享数据的修改，另一方都会接收到哦）
         */
        


    }
}
